home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************/
- /* SOURCE CODE FILE */
- /********************************************************************/
- /*
- * >>> File name: PANL DrawPanel.c
- *
- * >>> Purpose: Methods for Drawing
- * >>> Project: PoopDraw Version 1
- * >>> Date: 6/10/89
- * >>> By: Adam Treister
- *
- */
- /********************************************************************/
- /* For Your Information 1802 Hillside Rd. SB CA 93101 */
- /********************************************************************/
-
- #include "PoopDrawInc"
-
- typedef struct
- {
- _StdObjectFields
-
- ObjectHandle objectList; /* all objects in document */
- ObjectHandle selectList; /* the selected objects */
- ObjectHandle activeText; /* active text object */
- ObjectHandle doc; /* the disk based document */
-
- Boolean changed; /* TRUE - The window contents have been changed */
-
- short curTool; /* The current Tool */
- short curPat; /* The current Pattern */
- short curWeight; /* The current Line Weight */
-
- DrawStateRec drawState; /* draw state to give new objects */
- int fileVol; /* volume where current file lives */
- short displayScaling; /* scaling factor for displayed objects */
-
- } DrawPanelRec,*DrawPanelPtr,**DrawPanelHandle;
- /*------------------------------------------------------------------*/
-
- DrawPanelDispatch(DrawPanelHandle ObjectH,int message,LPtr ParmP);
-
-
- private void Dispose(DrawPanelHandle ObjectH);
- private void Blink(DrawPanelHandle ObjectH);
- private void Ungroup(DrawPanelHandle ObjectH);
- private void Group(DrawPanelHandle ObjectH);
- private void BringForward(DrawPanelHandle ObjectH,ObjectHandle Obj);
- private void SendBack(DrawPanelHandle ObjectH,ObjectHandle Obj);
- private void MouseDown(DrawPanelHandle ObjectH);
- private void KeyDown(DrawPanelHandle ObjectH);
- private void Update(DrawPanelHandle ObjectH);
- private void Save(DrawPanelHandle ObjectH,LPtr ParmP);
- private void Load(DrawPanelHandle ObjectH,LPtr ParmP);
-
- private void SetFill(DrawPanelHandle ObjectH,LPtr ParmP);
- private void SetPenPat(DrawPanelHandle ObjectH,LPtr ParmP);
- private void SetPenSize(DrawPanelHandle ObjectH,LPtr ParmP);
- void InitQDState(DrawStatePtr drawStateP);
- void DrawOutline(Rect r,int curTool);
- private void OutlineNewObject(DrawPanelHandle ObjectH,Point startPt, short curTool);
-
- private void ClickInPalette(DrawPanelHandle ObjectH,Point pt);
- private void InvertPaletteRect(int tool);
- private void FramePaletteRect(int tool);
-
- void DragActiveObjects(DrawPanelHandle ObjectH);
-
- /********************************************************************/
-
-
- DrawPanelDispatch(ObjectH,message,ParmP)
- DrawPanelHandle ObjectH;
- int message;
- LPtr ParmP;
- {
- switch (message)
- {
-
- case DISPOSE: Dispose(ObjectH); break;
- case KEYDOWN: KeyDown(ObjectH); break;
- case MOUSEDOWN: MouseDown(ObjectH); break;
- case UPDATE: Update(ObjectH); break;
- case FILL: SetFill(ObjectH,ParmP); break;
- case PENPAT: SetPenPat(ObjectH,ParmP); break;
- case PENSIZE: SetPenSize(ObjectH,ParmP); break;
- case SAVE: Save(ObjectH,ParmP); break;
- case LOAD: Load(ObjectH,ParmP); break;
-
- case GETDRAWSTATE: *(DrawStatePtr)ParmP = (*ObjectH)->drawState; break;
- case GROUP: Group(ObjectH); break;
- case UNGROUP: Ungroup(ObjectH); break;
-
-
- case OPEN: break;
-
- case MOVE: DragActiveObjects(ObjectH); break;
- case BRINGTOFRONT:
- case SENDTOBACK: Dispatch((*ObjectH)->selectList,message,(*ObjectH)->objectList); break;
- case CLRSELECT: Dispatch((*ObjectH)->selectList,message,NULL); break;
- case SELECT: Dispatch((*ObjectH)->selectList,ADDOBJECT,ParmP); break;
- case UNSELECT: Dispatch((*ObjectH)->selectList,DELOBJECT,ParmP); break;
- case ADDOBJECT:
- case DELOBJECT: Dispatch((*ObjectH)->objectList,message,ParmP); break;
-
- case IDLE: Dispatch((*ObjectH)->activeText,message,NULL); break;
- case GETTOOL: *ParmP = (long) (*ObjectH)->curTool; break;
- case SETACTIVETEXT: Dispatch((*ObjectH)->activeText,DEACTIVATE,NULL);
- (*ObjectH)->activeText = ParmP;
- Dispatch((*ObjectH)->activeText,ACTIVATE,NULL); break;
- case CLRACTIVETEXT: (*ObjectH)->activeText = NULL; break;
- default: DrawObjectDispatch(ObjectH,message,ParmP); break;
- } }
-
-
- /*------------------------------------------------------------------*/
- DrawPanelHandle NewDrawPanel(ObjectHandle WindowObject);
- DrawPanelHandle NewDrawPanel(WindowObject)
- ObjectHandle WindowObject;
- {
- DrawPanelHandle obj;
-
- obj = _GetHandleToRecord(DrawPanelRec);
- NullOutHandle(obj);
- (*obj)->port = (*WindowObject)->port;
- (*obj)->class = DRAWPANEL;
- (*obj)->dispatch = DrawPanelDispatch;
- (*obj)->bounds = (*WindowObject)->bounds;
- (*obj)->curTool = POINTER;
- (*obj)->curPat = GRAY;
- (*obj)->curWeight = LINEWT1;
- New(LIST,NULL,&(*obj)->objectList);
- New(LIST,NULL,&(*obj)->selectList);
- (*obj)->drawState.penSize = 1;
- (*obj)->drawState.penPat = BLACKPAT;
- (*obj)->drawState.fillPat = GRAYPAT;
- return(obj);
-
- }
- /*------------------------------------------------------------------*/
- static Point where = {90,90};
-
- void Save(ObjectH,ParmP)
- DrawPanelHandle ObjectH;
- LPtr ParmP;
- {
- FileHeaderPtr headerP;
- Handle h;
- long DoSaveAs;
- SFReply reply;
- Str255 fName;
-
- if (DoSaveAs = *ParmP) (*ObjectH)->fileVol = 0; /* no known vol -> untitled file */
- GetWTitle((*ObjectH)->port,fName);
-
- if ((*ObjectH)->fileVol)
- {
- reply.good = true;
- }
- else
- {
- SFPutFile(where,"\pSave the document as:",fName,NULL,&reply);
- }
- if (reply.good)
- {
- h = _GetHandleToRecord(FileHeaderRec);
- HLock(h); headerP = *h;
- headerP->fileVol = (*ObjectH)->fileVol = reply.vRefNum;
- StrCopy(reply.fName,headerP->fName);
- SetWTitle((*ObjectH)->port,reply.fName);
- headerP->curTool = (*ObjectH)->curTool;
- headerP->curPat = (*ObjectH)->curPat;
- headerP->curWeight = (*ObjectH)->curWeight;
- headerP->drawState = (*ObjectH)->drawState;
- headerP->wRect = GetWindowRect((*ObjectH)->port);
- Dispatch((*ObjectH)->objectList,GETSIZE,&headerP->nObjects);
- HUnlock(h);
- Dispatch((*ObjectH)->objectList,SETLEN,h);
- Dispatch((*ObjectH)->objectList,PACK,h);
- WriteHandleToFile(h,&reply);
- }
-
- }
- /*------------------------------------------------------------------*/
- void Load(ObjectH,inP)
- DrawPanelHandle ObjectH;
- LPtr inP;
- {
- FileHeaderPtr headerP;
- Handle h = (Handle) inP;
- long nObjects;
- Rect dummyRect;
- int i;
- IPtr p;
- int class;
- ObjectHandle NewObject;
-
- HLock(h); headerP = *h;
-
- (*ObjectH)->curTool = headerP->curTool;
- (*ObjectH)->curPat = headerP->curPat;
- (*ObjectH)->curWeight = headerP->curWeight;
- (*ObjectH)->drawState = headerP->drawState;
- (*ObjectH)->fileVol = headerP->fileVol;
- SetWTitle((*ObjectH)->port,headerP->fName);
- nObjects = headerP->nObjects;
- SetRect(&dummyRect,0,0,1,1);
- p = (Ptr) headerP + sizeof(FileHeaderRec);
-
- for (i = 0; i < nObjects ; i++)
- {
- class = *(int *) p;
- New(class,&dummyRect,&NewObject);
- Dispatch(NewObject,UNPACK,&p);
- Dispatch((*ObjectH)->objectList,ADDOBJECT,NewObject);
- if (BitTst(&(*NewObject)->attributes,SelectedBit))
- {
- Dispatch(NewObject,SELECT,NULL);
- Dispatch((*ObjectH)->selectList,ADDOBJECT,NewObject);
- }
- }
- InvalRect(&(*ObjectH)->bounds);
- HUnlock(h);
- MoveWindow ((*ObjectH)->port,headerP->wRect.left,headerP->wRect.top,TRUE);
- SizeWindow ((*ObjectH)->port,Width(headerP->wRect),Height(headerP->wRect),TRUE);
- DisposeHandle(h);
-
- }
- /*------------------------------------------------------------------*/
- void Dispose(ObjectH)
- DrawPanelHandle ObjectH;
- {
- long KillListAndContents = 1, KillListOnly = 2;
-
- Dispatch((*ObjectH)->objectList,DISPOSE,&KillListAndContents);
- Dispatch((*ObjectH)->selectList,DISPOSE,&KillListOnly);
- DisposeHandle(ObjectH);
- }
- /*------------------------------------------------------------------*/
- void MouseDown(ObjectH)
- DrawPanelHandle ObjectH;
- {
- Point pt;
- ObjectHandle objectH;
- long args[2];
-
- GetMouse(&pt);
- if (pt.h <= PALETTEWIDTH) ClickInPalette(ObjectH,pt);
- else
- {
- args[0] = (long) &pt;
- Dispatch((*ObjectH)->objectList,FIND,args);
- objectH = (ObjectHandle) args[1];
- if (objectH) Dispatch(objectH,MOUSEDOWN,NULL);
- else OutlineNewObject(ObjectH,pt, (*ObjectH)->curTool);
- }
- }
- /*------------------------------------------------------------------*/
-
- void KeyDown(ObjectH)
- DrawPanelHandle ObjectH;
- {
- if ((*ObjectH)->curTool == TEXT)
- { Dispatch((*ObjectH)->activeText,KEYDOWN,NULL); }
- else
- {
- extern EventRecord Event;
- char keyStroke;
- long KillOnlyElements = 1;
-
- keyStroke = Event.message & charCodeMask;
- if (keyStroke == BACKSPACE)
- Dispatch((*ObjectH)->selectList,DISPOSE,&KillOnlyElements);
- }
- }
- /*------------------------------------------------------------------*/
- void Update(ObjectH)
- DrawPanelHandle ObjectH;
- {
- PicHandle palette;
- if (palette = GetPicture (ToolPaletteID)) DrawPic(0,0,palette);
- InvertPaletteRect((*ObjectH)->curTool);
- FramePaletteRect((*ObjectH)->curPat);
- InvertPaletteRect((*ObjectH)->curWeight);
- Dispatch((*ObjectH)->objectList,DRAW,NULL);
- }
- /*------------------------------------------------------------------*/
- /* to group: delete all selected objects,
- * put them in a list, and add the list
- /*------------------------------------------------------------------*/
-
- void Group(ObjectH)
- DrawPanelHandle ObjectH;
- {
- ObjectHandle group,obj;
- int i;
- long nElems;
-
- New(GROUP,NULL,&group);
- Dispatch((*ObjectH)->selectList,GETSIZE,&nElems);
- for (i = 0; i < nElems; i++)
- {
- Dispatch((*ObjectH)->selectList,NEXT,&obj);
- Dispatch((*ObjectH)->objectList,DELOBJECT,obj);
- Dispatch(group,ADDOBJECT,obj);
- Dispatch(obj,UNSELECT,NULL);
- }
- Dispatch((*ObjectH)->selectList,CLRSELECT,NULL);
- Dispatch((*ObjectH)->objectList,ADDOBJECT,group);
- Dispatch((*ObjectH)->selectList,ADDOBJECT,group);
- Dispatch(group,SELECT,NULL);
- Dispatch(group,INVAL,NULL);
- }
- /*------------------------------------- send ungroup down to the group object ------------*/
- void Ungroup(ObjectH)
- DrawPanelHandle ObjectH;
- {
- ObjectHandle obj;
- long nElems;
-
- Dispatch((*ObjectH)->selectList,GETSIZE,&nElems);
- if (nElems == 1) /* only ungroup 1 at a time (an arbitrary restriction) */
- {
- Dispatch((*ObjectH)->selectList,NEXT,&obj); /* get the one item */
- if ((*obj)->class == GROUP)
- {
- Dispatch(obj,UNGROUP,NULL);
- }
- }
- else SysBeep(4L);
- }
- /* ============================================================ */
- /* */
- /* SUPPORTING ROUTINES */
- /* */
- /* ============================================================ */
-
- /* ------------------------------------------------------------ */
- /* */
- /* OutlineNewObject */
- /* */
- /* This routines creates a new object. First the mouse is */
- /* used to define the objects boundry rect. Then the actual */
- /* object is created. */
- /* */
- /* */
- /* ------------------------------------------------------------ */
-
- void OutlineNewObject(ObjectH,startPt, curTool)
- DrawPanelHandle ObjectH;
- Point startPt;
- short curTool;
- {
- ObjectHandle NewObject;
- Point lastPos,curPos;
- Rect newRect,oldRect;
-
- SetRect(&newRect,startPt.h,startPt.v,startPt.h,startPt.v);
- PenMode(patXor); PenPat(gray); PenSize(1,1);
-
- oldRect = newRect;
- lastPos = curPos;
- DrawOutline(newRect,curTool);
- while (StillDown())
- {
- GetMouse(&curPos);
- if ((curPos.h != lastPos.h) OR (curPos.v != lastPos.v))
- {
-
- DrawOutline(oldRect,curTool);
- DrawOutline(newRect,curTool);
- oldRect = newRect;
- lastPos = botRight(newRect) = curPos;
-
- } }
- DrawOutline(oldRect,curTool);
-
- PenPat(black); PenMode(patCopy);
- if (curTool == POINTER)
- {
- Dispatch((*ObjectH)->selectList,CLRSELECT,NULL);
- Dispatch((*ObjectH)->objectList,SELECTRECT,&newRect);
- }
- else
- {
- New(curTool,&newRect,&NewObject);
-
- if (NewObject)
- {
- Dispatch((*ObjectH)->selectList,CLRSELECT,NULL);
- Dispatch((*ObjectH)->objectList,ADDOBJECT,NewObject);
- Dispatch(NewObject,SELECT,NULL);
- Dispatch((*ObjectH)->selectList,ADDOBJECT,NewObject);
- (*ObjectH)->changed = true;
- }
- }
- }
- /*------------------------------------------------------------------*/
-
- void DrawOutline(r,curTool)
- Rect r;
- int curTool;
- {
- if (curTool != LINE) SortRect(&r);
-
- if (curTool == LINE) DrawLine(topLeft(r),botRight(r));
- else if (curTool == OVAL) FrameOval(&r);
- else FrameRect(&r);
- }
-
- /* ------------------------------------------------------------ */
- /* */
- /* EDIT / SELECT ALL Menu Item handler */
- /* */
- /* 02/28/88 function created JMC */
- /* */
- /* ------------------------------------------------------------ */
- void SelectAll(DrawPanelHandle ObjectH);
-
- void SelectAll(ObjectH)
- DrawPanelHandle ObjectH;
-
- {
- Dispatch((*ObjectH)->objectList,SELECT,NULL);
- }
-
-
- /*------------------------------------generic method-------------*/
- /*
- * Function: -- DragActiveObjects
- *
- *
- * Date: -- Feb. 20, 1989
- * PoopDraw Version 1 -- Copyright FYI,1989 -- Adam Treister
- /*---------------------------------------------------------------*/
-
- void DragActiveObjects(ObjectH)
- DrawPanelHandle ObjectH;
-
- {
- extern EventRecord Event;
-
- RgnHandle TheDragRgn;
- Point startPoint;
- long endPoint;
- Rect prtRect;
-
- TheDragRgn = NewRgn(); /* make the region to drag */
- OpenRgn();
- Dispatch((*ObjectH)->selectList,FRAME,NULL);
- CloseRgn(TheDragRgn);
-
- startPoint = Event.where;
- GlobalToLocal(&startPoint);
- prtRect = (*ObjectH)->port->portRect;
- InsetRect(&prtRect, 20, 20);
- endPoint = DragGrayRgn(TheDragRgn, startPoint, &prtRect, &prtRect, 0, NULL);
-
- Dispatch((*ObjectH)->selectList, MOVE,&endPoint); /* move them all */
- DisposeRgn(TheDragRgn);
- (*ObjectH)->changed = true;
- }
-
- /*------------------------------------------------------------------*/
-
- /********************************************************************/
-
- void SetFill(ObjectH,ParmP)
- DrawPanelHandle ObjectH;
- LPtr ParmP;
- {
- long ct;
-
- Dispatch((*ObjectH)->selectList,GETSIZE,&ct);
- if (ct)
- { Dispatch((*ObjectH)->selectList,FILL,ParmP); }
- else
- (*ObjectH)->drawState.fillPat = *(int *) ParmP;
-
- }
- /*------------------------------------------------------------------*/
- void SetPenPat(ObjectH,ParmP)
- DrawPanelHandle ObjectH;
- LPtr ParmP;
- {
- long ct;
-
- Dispatch((*ObjectH)->selectList,GETSIZE,&ct);
- if (ct)
- { Dispatch((*ObjectH)->selectList,PENPAT,ParmP); }
- else
- (*ObjectH)->drawState.penPat = *(int *) ParmP;
- }
- /*------------------------------------------------------------------*/
- void SetPenSize(ObjectH,ParmP)
- DrawPanelHandle ObjectH;
- LPtr ParmP;
- {
- long ct;
-
- Dispatch((*ObjectH)->selectList,GETSIZE,&ct);
- if (ct)
- { Dispatch((*ObjectH)->selectList,PENSIZE,ParmP); }
- else
- (*ObjectH)->drawState.penSize = *(int *) ParmP;
- }
- /********************************************************************/
-
-
-
- void ClickInPalette(ObjectH,pt)
- DrawPanelHandle ObjectH;
- Point pt;
- {
- int toolHit,curTool,message;
- int pat;
-
- toolHit = ((pt.v-1) / PALETTEHEIGHT) + 1;
- curTool = (*ObjectH)->curTool;
- if (toolHit <= TEXT)
- {
- if (toolHit != curTool)
- {
- InvertPaletteRect(curTool);
- InvertPaletteRect(toolHit);
- (*ObjectH)->curTool = toolHit;
- message = (toolHit == TEXT) ? ACTIVATE : DEACTIVATE;
- Dispatch((*ObjectH)->activeText, message,NULL);
- }
- }
- else if (toolHit <= WHITE)
- {
- if (toolHit != (*ObjectH)->curPat)
- {
- FramePaletteRect((*ObjectH)->curPat);
- FramePaletteRect((*ObjectH)->curPat = toolHit);
-
- switch (toolHit)
- {
- case BLACK: pat = BLACKPAT; break;
- case DKGRAY: pat = DKGRAYPAT; break;
- case GRAY: pat = GRAYPAT; break;
- case LTGRAY: pat = LTGRAYPAT; break;
- case WHITE: pat = WHITEPAT; break;
- }
- message = (_OptionKeyDown(Event)) ? PENPAT : FILL;
- Dispatch(ObjectH,message,&pat);
- }
- }
- else if (toolHit <= LINEWT3)
- {
- if (toolHit != (*ObjectH)->curWeight)
- {
- int weight;
-
- InvertPaletteRect((*ObjectH)->curWeight);
- InvertPaletteRect((*ObjectH)->curWeight = toolHit);
- switch (toolHit)
- {
- case LINEWT0: weight = 0; break;
- case LINEWT1: weight = 1; break;
- case LINEWT2: weight = 2; break;
- case LINEWT3: weight = 4; break;
- }
- Dispatch(ObjectH,PENSIZE,&weight);
- }
- }
- }
- /*------------------------------------------------------------------*/
-
- void InvertPaletteRect(tool)
- int tool;
- {
- Rect r;
- int top,bottom;
-
- --tool;
- top = PALETTEHEIGHT * tool + 2;
- bottom = top + PALETTEHEIGHT - 3;
- SetRect(&r,2,top,PALETTEWIDTH-2,bottom);
- InvertRect(&r);
- }
- /*------------------------------------------------------------------*/
-
- void FramePaletteRect(tool)
- int tool;
- {
- Rect r;
- int top,bottom;
-
- --tool;
- top = PALETTEHEIGHT * tool + 1;
- bottom = top + PALETTEHEIGHT - 1;
- SetRect(&r,1,top,PALETTEWIDTH-1,bottom);
- PenSize(3,3); PenMode(patXor);
- FrameRect(&r);
- PenNormal();
- }
-
-